home *** CD-ROM | disk | FTP | other *** search
- ; /*
- sc displayiff.c DATA=FAR NMINC STRMERGE NOSTKCHK NOSTDIO IGNORE=73 STRUCTUREEQUIVALENCE
- slink from lib:c.o displayiff.o to //Clients/DisplayIFF lib /lib/client.lib lib:sc.lib lib:amiga.lib SC SD NOICONS STRIPDEBUG
- delete displayiff.o
- quit
-
- DisplayIFF 1.2 (Client for BServer)
-
- Copyright © 1994 Stefano Reksten of 3AM - The Three Amigos!!!
- All rights reserved.
-
- */
-
- #include <exec/types.h>
- #include <exec/memory.h>
- #include <intuition/intuition.h>
- #include <datatypes/pictureclass.h>
-
- #include <clib/exec_protos.h>
- #include <clib/intuition_protos.h>
- #include <clib/graphics_protos.h>
- #include <clib/dos_protos.h>
- #include <clib/alib_protos.h>
- #include <clib/icon_protos.h>
- #include <clib/asl_protos.h>
- #include <string.h>
- #include <time.h>
- #include <stdio.h>
-
- #include "/include/client.h"
- #include "/include/bitmap/bitmap.h"
- #include "/include/bitmap/bitmap_pragmas.h"
-
- #define BADFLAGS (SPRITES|VP_HIDE|GENLOCK_AUDIO|GENLOCK_VIDEO)
- #define FLAGMASK (~BADFLAGS)
- #define CAMGMASK (FLAGMASK & 0x0000FFFFL)
-
- #define BMHDB_CMAPOK 7
- #define BMHDF_CMAPOK (1 << BMHDB_CMAPOK)
-
- struct IntuitionBase *IntuitionBase;
- struct GfxBase *GfxBase;
- struct Library *BitMapBase, *IconBase;
-
- extern ULONG RangeSeed;
-
- struct Screen *scr;
- struct BitMap *iffbmap;
- UBYTE *iffctable;
- ULONG color_count, displayID;
- char filename[128], drawername[128];
- BOOL domask, iff_loaded;
- struct BitMapHeader bmhd;
- BPTR iffhandle;
-
- UWORD top, left, delay = 1;
- UBYTE frameptr = 0;
- struct BitMap *bmap, *scalebmap;
-
- struct DisplayIDInformation *dinfo;
- struct BitMapScaleInfo myscaleinfo = {
- NULL, NULL, NULL, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, NULL };
-
-
- BOOL GetPicName( void )
- {
- struct DiskObject *dobj;
- char **ttypes;
- char *picname;
- BOOL result = FALSE;
-
- if ( IconBase = OpenLibrary( "icon.library", 0L ) )
- {
- if ( dobj = GetDiskObject( "DisplayIFF" ) )
- {
- ttypes = dobj->do_ToolTypes;
- if ( picname = FindToolType( ttypes, "PICTURE" ) )
- {
- strcpy( filename, picname );
- strcpy( drawername, picname );
- *(PathPart(drawername)) = 0;
- result = TRUE;
- }
-
- domask = (BOOL)FindToolType( ttypes, "MASK" );
-
- FreeDiskObject( dobj );
- }
- CloseLibrary( IconBase );
- }
- return result;
- }
-
-
- void DisposeIFF( void )
- {
- if ( iffbmap )
- {
- FreeBitMap( iffbmap );
- iffbmap = NULL;
- }
- if ( iffctable )
- {
- FreeVec( iffctable );
- iffctable = NULL;
- }
- }
-
-
- BOOL ReadUncompressedFile( void )
- {
- UBYTE *address, plane;
- UWORD row, bytesperrow;
-
- bytesperrow = ((bmhd.bmh_Width+15)>>4)<<1;
-
- for ( row = 0; row < bmhd.bmh_Height; row++ )
- {
- for ( plane = 0; plane < bmhd.bmh_Depth; plane++ )
- {
- address = iffbmap->Planes[plane] + row * iffbmap->BytesPerRow;
- if ( Read( iffhandle, address, bytesperrow ) != bytesperrow )
- return FALSE;
- }
- }
- return TRUE;
- }
-
-
- BOOL ReadByteRun1( ULONG body_length )
- {
- BYTE *memory;
- register BYTE *source;
- register UBYTE plane, counter, *dest;
- register UWORD row, bytesperrow, rowcounter;
- BOOL result = FALSE;
-
- if ( memory=(UBYTE *)AllocMem( body_length, MEMF_ANY|MEMF_CLEAR ) )
- {
- if ( body_length = Read( iffhandle, memory, body_length ) )
- {
- source = memory;
-
- bytesperrow = ((bmhd.bmh_Width+15)>>4)<<1;
-
- for ( row = 0; row < bmhd.bmh_Height; row++ )
- {
- for ( plane = 0; plane < bmhd.bmh_Depth; plane++ )
- {
- dest = iffbmap->Planes[plane] + row * iffbmap->BytesPerRow;
- for ( rowcounter = 0; rowcounter < bytesperrow; )
- {
- if ( *source == -128 )
- source++;
- else
- if ( *source >= 0 )
- {
- counter = *source++ + 1;
- rowcounter += counter;
- while( counter )
- {
- *dest++ = *source++;
- counter--;
- }
- }
- else
- {
- counter = 1 - *source++;
- rowcounter += counter;
- while( counter )
- {
- *dest++ = *source;
- counter--;
- }
- source++;
- }
- }
- }
- }
- FreeMem( memory, body_length );
- result = TRUE;
- }
- }
- return result;
- }
-
-
- UBYTE ReadByte( void ) {
- UBYTE my_byte;
- Read( iffhandle, &my_byte, sizeof(UBYTE) );
- return( my_byte ); }
-
-
- ULONG ReadLong( void ) {
- ULONG my_long;
- Read( iffhandle, &my_long, sizeof(ULONG) );
- return( my_long ); }
-
-
- BOOL DecodeILBM( char *filename )
- {
- ULONG total_read = 12, form_length, chunk_found, chunk_length;
- UWORD n;
- BOOL found_body = FALSE;
-
- iff_loaded = FALSE;
-
- if ( !( iffhandle = Open( filename, MODE_OLDFILE ) ) )
- goto end;
-
- if ( ReadLong()!=ID_FORM )
- goto end;
-
- form_length = ReadLong();
-
- if ( ReadLong()!=ID_ILBM )
- goto end;
-
- do
- {
- chunk_found = ReadLong();
- chunk_length = ReadLong();
- total_read += 4 + chunk_length;
-
- switch( chunk_found )
- {
- case ID_BMHD:
- Read( iffhandle, &bmhd, sizeof(struct BitMapHeader) );
- if ( bmhd.bmh_Compression > 1 )
- goto end;
- if ( bmhd.bmh_Depth == 8 && domask )
- goto end;
- myscaleinfo.bsi_Width = bmhd.bmh_Width;
- myscaleinfo.bsi_Height = bmhd.bmh_Height;
- break;
- case ID_CAMG:
- displayID = ReadLong() & CAMGMASK;
- if ( displayID & HAM )
- goto end;
- break;
- case ID_CMAP:
- color_count = chunk_length/3;
- if ( displayID & EXTRA_HALFBRITE )
- color_count >>= 1;
- if ( iffctable = AllocVec( chunk_length, MEMF_ANY | MEMF_CLEAR ) )
- Read( iffhandle, iffctable, chunk_length );
- if ( !(bmhd.bmh_Pad & BMHDF_CMAPOK) )
- for ( n = 0; n < chunk_length; n++ )
- *(iffctable+n) = (*(iffctable+n) & 0xF0) + (*(iffctable+n)>>4);
- break;
- case ID_BODY:
- found_body = TRUE;
-
- if ( !(iffbmap = CreateBitMap( bmhd.bmh_Width, bmhd.bmh_Height, bmhd.bmh_Depth + (domask?1:0) ) ) )
- goto end;
-
- if ( bmhd.bmh_Compression )
- iff_loaded = ReadByteRun1( chunk_length );
- else
- iff_loaded = ReadUncompressedFile();
-
- if ( iff_loaded && domask )
- {
- register UBYTE plane, *srcaddress, *dstaddress, bmhbpr;
- register UWORD byte, row;
-
- bmhbpr = ((bmhd.bmh_Width+15)>>4)<<1;
- for ( row = 0; row < bmhd.bmh_Height; row++ )
- for ( plane = 0; plane < bmhd.bmh_Depth; plane++ )
- {
- dstaddress = iffbmap->Planes[bmhd.bmh_Depth] + iffbmap->BytesPerRow * row;
- srcaddress = iffbmap->Planes[plane] + iffbmap->BytesPerRow * row;
- for ( byte = 0; byte < bmhbpr; byte++ )
- *dstaddress++ |= *srcaddress++;
- }
- }
-
- Close( iffhandle ); iffhandle = NULL;
- break;
- default:
- Seek( iffhandle, chunk_length, OFFSET_CURRENT );
- break;
- }
- }
- while( !found_body && total_read < form_length );
-
- return TRUE;
-
- end:
- if ( iffhandle )
- {
- Close( iffhandle );
- iffhandle = NULL;
- }
- DisposeIFF();
- return FALSE;
- }
-
-
-
- void AnyIFF( void )
- {
- BOOL success = FALSE;
- UWORD scaleN, scaleD, swidth, sheight, n, scaledw, scaledh;
- struct Rectangle *rect;
- UBYTE *address;
-
- if ( DecodeILBM( filename ) )
- {
- rect = GETTXTOSCANRECT(dinfo);
-
- swidth = RECTANGLEWIDTH(rect);
- if ( swidth <= bmhd.bmh_Width )
- swidth = (iffbmap->BytesPerRow<<3) + 1;
- sheight = RECTANGLEHEIGHT(rect);
- if ( sheight <= bmhd.bmh_Height )
- sheight = iffbmap->Rows + 1;
-
- if ( bmap = CreateBitMap( bmhd.bmh_Width, bmhd.bmh_Height, bmhd.bmh_Depth + (domask?1:0) ) )
- {
- if ( scalebmap = CreateBitMap( bmhd.bmh_Width, bmhd.bmh_Height, bmhd.bmh_Depth + (domask?1:0) ) )
- {
- myscaleinfo.bsi_SrcBitMap = iffbmap;
- myscaleinfo.bsi_TempBitMap = scalebmap;
- myscaleinfo.bsi_DestBitMap = bmap;
-
- if ( scr = OpenScreenTags( NULL,
- SA_DisplayID, DISPLAYID(dinfo) | ( displayID & EXTRA_HALFBRITE ),
- SA_Width, swidth,
- SA_Height, sheight,
- SA_Depth, bmhd.bmh_Depth,
- SA_Overscan, OSCAN_TEXT,
- SA_Type, CUSTOMSCREEN,
- SA_Quiet, TRUE,
- TAG_END ) )
- {
- register struct ViewPort *vp = &(scr->ViewPort);
-
- success = TRUE;
-
- SpritesOff();
-
- address = iffctable;
- for ( n = 0; n < color_count; n++ )
- SetRGB4( vp, n, *address++>>4, *address++>>4, *address++>>4 );
-
- frameptr = 0;
-
- while( STILL_BLANKING )
- {
- do {
- scaleN = RangeRand( 32 ) + 1;
- scaleD = RangeRand( 32 ) + 1;
- } while ( scaleN >= scaleD );
-
- myscaleinfo.bsi_HorNum = scaleN;
- myscaleinfo.bsi_VertNum = scaleN;
- myscaleinfo.bsi_HorDen = scaleD;
- myscaleinfo.bsi_VertDen = scaleD;
-
- scaledw = scaleN * bmhd.bmh_Width / scaleD;
- scaledh = scaleN * bmhd.bmh_Height / scaleD;
-
- left = RangeRand( swidth - scaledw - 1);
- top = RangeRand( sheight - scaledh - 1);
-
- myscaleinfo.bsi_Flags = NULL;
- if ( RangeRand( 2 ) == 0 )
- myscaleinfo.bsi_Flags |= BSIF_INVERTHOR;
- ScaleBitMap ( &myscaleinfo );
-
- if ( domask )
- BltMaskBitMapRastPort( bmap, 0, 0,
- &scr->RastPort, left, top,
- scaledw, scaledh, (ABC|ABNC|ANBC), (PLANEPTR)bmap->Planes[bmhd.bmh_Depth] );
- else
- BltBitMapRastPort( bmap, 0, 0,
- &scr->RastPort, left, top,
- scaledw, scaledh, 0xC0 );
- }
- SpritesOn();
- CloseScreen( scr );
- }
- DisposeBitMap( scalebmap );
- }
- DisposeBitMap( bmap );
- }
- DisposeIFF();
- }
-
- if ( !success )
- SendClientMsg( ACTION_FAILED );
- }
-
-
- /*void __main( char *line )*/
- void main( int argc, char **argv )
- {
- if ( IntuitionBase = (struct IntuitionBase *)OpenLibrary( "intuition.library", 36L ) )
- {
- if ( GfxBase = (struct GfxBase *)OpenLibrary( "graphics.library",0L ) )
- {
- if ( BitMapBase = OpenLibrary( "bitmap.library", 0L ) )
- {
- if ( GetPicName() )
- {
- if ( dinfo = OpenCommunication() )
- {
- RangeSeed = time( NULL );
-
- AnyIFF();
- CloseCommunication( dinfo );
- }
- }
- CloseLibrary( BitMapBase );
- }
- CloseLibrary( (struct Library *)GfxBase );
- }
- CloseLibrary( (struct Library *)IntuitionBase );
- }
- }
-